﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

using MySql.Data.MySqlClient;

namespace MakeIT.MiraPark.Negocios
{
    public static partial class ModelBO
    {

        public static PagamentoVO getPagamento(int idPagamento)
        {
            List<PagamentoVO> listaPagamentoVo = getPagamentos(idPagamento, false, false, null, null, null, null);
            if (listaPagamentoVo != null && listaPagamentoVo.Count > 0)
                return listaPagamentoVo[0];
            else
                return null;
        }

        public static List<PagamentoVO> getPagamentos()
        {
            return getPagamentos( null, false, false, null, null, null, null);
        }

        public static List<PagamentoVO> getPagamentos(int? idPagamento, bool semDtPagamento, bool comDtPagamento, DateTime? dtVctoIni, DateTime? dtVctoFim, DateTime? dtPgtoIni, DateTime? dtPgtoFim)
        {
            string where = "WHERE ";
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT p.IdPagamento, p.Pagamento, p.DtVencimento, p.DtPagamento, p.IdFormaPagamento, fp.FormaPagamento, p.Valor, p.ValorPago ");
            query.AppendLine("FROM pagamento p LEFT JOIN formapagamento fp ON p.IdFormaPagamento = fp.IdFormaPagamento ");

            if (idPagamento != null)
            {
                query.AppendLine(where + "p.IdPagamento=?IdPagamento ");
                where = "AND ";
            }
            if (semDtPagamento)
            {
                query.AppendLine(where + "p.DtPagamento is null ");
                where = "AND ";
            }
            if (comDtPagamento)
            {
                query.AppendLine(where + "p.DtPagamento is not null ");
                where = "AND ";
            }
            if (dtVctoIni != null && dtVctoFim != null)
            {
                query.AppendLine(where + "p.DtVencimento BETWEEN DATE(?DtPgtoINI) AND DATE(?DtPgtoFIM) ");
                where = "AND ";
            }else if (dtVctoIni!=null){
                query.AppendLine(where + "p.DtVencimento = DATE(?DtPgtoINI) ");
                where = "AND ";
            }
            else if (dtVctoFim != null)
            {
                query.AppendLine(where + "p.DtVencimento = DATE(?DtPgtoFIM) ");
            }
            if (dtPgtoIni != null && dtPgtoFim != null)
            {
                query.AppendLine(where + "p.DtPagamento BETWEEN DATE(?DtPgtoINI) AND DATE(?DtPgtoFIM) ");
                where = "AND ";
            }
            else if (dtPgtoIni != null)
            {
                query.AppendLine(where + "p.DtPagamento = DATE(?DtPgtoINI) ");
                where = "AND ";
            }
            else if (dtPgtoFim != null)
            {
                query.AppendLine(where + "p.DtPagamento = DATE(?DtPgtoFIM) ");
            }

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            if (idPagamento != null) cmd.Parameters.AddWithValue("?IdPagamento", idPagamento);
            if (dtVctoIni != null) cmd.Parameters.AddWithValue("?DtPgtoINI", dtVctoIni);
            if (dtVctoFim != null) cmd.Parameters.AddWithValue("?DtPgtoFIM", dtVctoFim);
            if (dtPgtoIni != null) cmd.Parameters.AddWithValue("?DtPgtoINI", dtPgtoIni);
            if (dtPgtoFim != null) cmd.Parameters.AddWithValue("?DtPgtoFIM", dtPgtoFim);

            MySqlDataReader reader = null;
            try
            {
                cmd.Connection.Open();

                reader = cmd.ExecuteReader();

                List<PagamentoVO> listPagamentoVOs = new List<PagamentoVO>();

                while (reader.Read())
                {
                    PagamentoVO pagamentoVO = PagamentoVO.CreatePagamentoVO();
                    pagamentoVO.idPagamento = reader.GetInt32("IdPagamento");
                    pagamentoVO.pagamento = reader.GetString("Pagamento");
                    pagamentoVO.dtVencimento = reader.GetDateTime("DtVencimento");
                    if (!reader.IsDBNull(reader.GetOrdinal("DtPagamento")))
                        pagamentoVO.dtPagamento = reader.GetDateTime("DtPagamento");
                    pagamentoVO.formaPagamentoVO.idFormaPagamento = reader.GetInt32("IdFormaPagamento");
                    if (!reader.IsDBNull(reader.GetOrdinal("FormaPagamento")))
                        pagamentoVO.formaPagamentoVO.formaPagamento = reader.GetString("FormaPagamento");
                    pagamentoVO.valor = reader.GetDecimal("Valor");
                    pagamentoVO.valorPago = reader.GetDecimal("ValorPago");

                    listPagamentoVOs.Add(pagamentoVO);
                }
                reader.Close();
                return listPagamentoVOs;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }
 
        }

        public static void setPagamento(PagamentoVO pagamentoVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("UPDATE pagamento ");
            query.AppendLine("SET Pagamento=?Pagamento, DtVencimento=?DtVencimento, DtPagamento=?DtPagamento, IdFormaPagamento=?IdFormaPagamento, Valor=?Valor, ValorPago=?ValorPago ");
            query.AppendLine("WHERE IdPagamento=?IdPagamento ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdPagamento", pagamentoVO.idPagamento);
            cmd.Parameters.AddWithValue("?Pagamento", pagamentoVO.pagamento);
            cmd.Parameters.AddWithValue("?DtVencimento", pagamentoVO.dtVencimento);
            cmd.Parameters.AddWithValue("?DtPagamento", pagamentoVO.dtPagamento);
            cmd.Parameters.AddWithValue("?IdFormaPagamento", pagamentoVO.formaPagamentoVO.idFormaPagamento);
            cmd.Parameters.AddWithValue("?Valor", pagamentoVO.valor);
            cmd.Parameters.AddWithValue("?ValorPago", pagamentoVO.valorPago);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }
        public static void setPagamentos(List<PagamentoVO> listPagamentoVO)
        {
            if (listPagamentoVO != null)
                foreach (PagamentoVO pagamentoVO in listPagamentoVO)
                    setPagamento(pagamentoVO);
        }

        public static long newPagamento(PagamentoVO pagamentoVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("INSERT INTO pagamento ");
            query.AppendLine("SET Pagamento=?Pagamento, DtVencimento=?DtVencimento, DtPagamento=?DtPagamento, IdFormaPagamento=?IdFormaPagamento, Valor=?Valor, ValorPago=?ValorPago ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdPagamento", pagamentoVO.idPagamento);
            cmd.Parameters.AddWithValue("?Pagamento", pagamentoVO.pagamento);
            cmd.Parameters.AddWithValue("?DtVencimento", pagamentoVO.dtVencimento);
            cmd.Parameters.AddWithValue("?DtPagamento", pagamentoVO.dtPagamento);
            cmd.Parameters.AddWithValue("?IdFormaPagamento", pagamentoVO.formaPagamentoVO.idFormaPagamento);
            cmd.Parameters.AddWithValue("?Valor", pagamentoVO.valor);
            cmd.Parameters.AddWithValue("?ValorPago", pagamentoVO.valorPago);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
                return cmd.LastInsertedId;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }
        public static void newPagamentos(List<PagamentoVO> listPagamentoVO)
        {
            if (listPagamentoVO != null)
                foreach (PagamentoVO pagamentoVO in listPagamentoVO)
                    newPagamento(pagamentoVO);
        }

        public static void delPagamento(PagamentoVO pagamentoVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("DELETE FROM pagamento ");
            query.AppendLine("WHERE IdPagamento=?IdPagamento ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdPagamento", pagamentoVO.idPagamento);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }
        public static void delPagamentos(List<PagamentoVO> listPagamentoVO)
        {
            if (listPagamentoVO != null)
                foreach (PagamentoVO pagamentoVO in listPagamentoVO)
                    delPagamento(pagamentoVO);
        }
    }
}
